package org.zjh.view.game;

import org.zjh.constant.ImageConstant;

import javax.swing.*;
import java.awt.*;

/**
 * @description: Game help panel displaying game rules.
 * @version 1.0
 */
public class GameHelpPanel extends JPanel {

    public GameHelpPanel(){
        init();
    }

    /**
     * 初始化
     */
    private void init() {
        // 设置布局管理器
        setLayout(new BorderLayout());
        // 创建一个文本区域
        JTextArea textArea = new JTextArea(20, 50);
        // 自动换行
        textArea.setLineWrap(true);
        // 禁止编辑
        textArea.setEditable(false);
        // 设置字体、颜色、边距和行距
        Font font = new Font("隶书", Font.PLAIN, 16);
        textArea.setFont(font);
        // 设置字体颜色
        textArea.setForeground(Color.BLACK);
        // 设置边距
        textArea.setMargin(new Insets(10, 10, 10, 10));
        textArea.setLineWrap(true); // 自动换行

        // 设置初始文本内容
        String helpText = "\t\t\t\t\t游戏规则\n\n" +
                "1）游戏人数：3人。\n\n" +
                "2）游戏牌数：54张，带大小王，一人17张，三张作为底牌，地主未确定前农民家不能看到底牌。\n\n" +
                "3）出牌规则：\n\n" +
                "    1.发牌：一副牌54张，带大小王，一人17张，三张作为底牌，地主未确定前农民家不能看到底牌。\n\n" +
                "    2.叫地主（叫分玩法）：叫分按出牌的顺序轮流进行，叫牌时可以选择叫分，或“不叫”。叫分最高者当选地主、最高叫分为本局底分。\n\n" +
                "    3.叫地主（叫地主玩法）：叫分按出牌的顺序轮流进行，叫地主时可以选择“叫地主”、“不叫”，直到有一位玩家选择叫地主，由此玩家当选地主并进入出牌阶段。\n\n" +
                "    4.第一轮叫牌的玩家由获取到叫分牌的玩家开始叫分。\n\n" +
                "    5.如果都选择不叫，则重新发牌。\n\n" +
                "    7.出牌：由地主先出牌，然后按逆时针依次出牌，轮到玩家跟牌时，玩家可以选择“不出”或者出比上一家大的牌。\n\n" +
                "    8.胜负判定：地主打完牌为地主获胜，某一个农民打完牌则为所有农民获胜。\n\n" +
                "4）牌型：\n\n" +
                "    火箭：即双王（大王和小王），最大的牌。\n\n" +
                "    炸弹：四张相同的数值牌（如四个7）。\n\n" +
                "    单牌：单个牌（如红桃5）。\n\n" +
                "    对牌：数值相同的牌（如梅花4加方块4）。\n\n" +
                "    三张牌：数值相同的三张牌（如3个J）。\n\n" +
                "    三带一（三带二）：数值相同的三张牌+一张单牌或一对牌。例如：333+6,333+99。\n\n" +
                "    单顺：五张或更多的连续单牌。不包括2和大小王（如34567、10JQKA）。\n\n" +
                "    双顺：三对或更多的连续对牌。不包括2和大小王（如334455、JJQQKKAA）。\n\n" +
                "    三顺：两个或更多的连续三张牌。不包括2点和双王（如333444,333444555）。\n\n" +
                "    飞机带翅膀：三顺+同数量的单牌或对牌（如333444+7+9、333444+66+77）（飞机中如果含有炸弹，则翅膀中不能带炸弹中的牌）。\n\n" +
                "    四带二：四张数值相同的牌+两个单牌或对牌（如5555+3+8、5555+44+77）（不是炸弹）。\n\n" +
                "    注意：当玩家所出的牌为最后一手牌时，也必须符合以上出牌规则，不能出现444555+6的牌型。\n\n" +
                "5）牌型大小：\n\n" +
                "    1.火箭最大，可以打任意其他的牌。\n\n" +
                "    2.炸弹比火箭小，比其他的牌大。都是炸弹时牌牌的分值比大小。\n\n" +
                "    3.除火箭和炸弹外，其他牌必须要牌型相同且张数相同才能比大小。\n\n" +
                "    4.单牌按分值比大小，依次是大王>小王>2>1>K>Q>J>10>9>8>7>6>5>4>3。\n\n" +
                "    5.对牌，三张牌都是按比分值比大小。\n\n" +
                "    6.顺子按最大的一张比大小。\n\n" +
                "    7.飞机带翅膀和四带二按其中的三顺和四张部分比较大小，带的牌不影响大小。\n\n" +
                "    8.注意：以上牌型比较均不分花色。\n\n" +
                "6）积分规则：\n\n" +
                "    1.倍数：叫地主玩法初始分为1分（叫分玩法初始分为最大叫分，乘以加倍的倍数）每出一个炸弹或者火箭翻一倍。（留在手里没有出去的火箭和炸弹不算）。\n\n" +
                "    2.春天：地主所有牌出完，而其余两家一张未出，分数X2。\n\n" +
                "    4.炸弹：每打出一个炸弹，分数X2。\n\n" +
                "    5.火箭：火箭打出后，分数X2。\n";

        textArea.setText(helpText);
        // 创建一个滚动面板，将文本区域添加到滚动面板中
        JScrollPane scrollPane = new JScrollPane(textArea);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        // 使滚动面板透明
        scrollPane.setOpaque(false);
        // 使视口透明
        scrollPane.getViewport().setOpaque(false);
        // 将滚动面板添加到 GameHelpPanel 中
        add(scrollPane, BorderLayout.CENTER);
    }


    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // 设置背景图
        g.drawImage(ImageConstant.INTRODUCE_IMAGE.getImage(), 0, 0, ImageConstant.INTRODUCE_IMAGE.getIconWidth(), ImageConstant.INTRODUCE_IMAGE.getIconHeight(), null);
    }
}
